#ifndef _FILEUTILS
#define _FILEUTILS
#include <list>
#include <vector>
#include <string>
#include <dirent.h>
#include "Exception.h"
class FileException : public Exception {
    public:
        FileException(std::string msg);
};
class FileInfo {
    public:
        FileInfo();
        FileInfo(std::string name, int type, long long size);
        std::string name;
        long long size;
        int type;
        /**
         * 返回序列化的文件信息
         */
        std::string toString();
        /**
         * 返回方便阅读的文件信息字符串
         */
        std::string toStandardStr();
        /**
         * 解析序列化的文件信息，并将解析后的信息存入到参数info，若解析失败则抛出Exception
         * @param str 序列化字符串
         * @param info 保存解析结果的FileInfo引用对象
         * @throw Exception
         */
        static void parse(const char * str, FileInfo& info);
        /**
         * 从本地文件路径中加载文件信息
         * 若文件不存在则抛出异常
         * @throw FileException
         */
        void loadFromLocal(const char * filePath);
        /**
         * 从本地文件路径中加载文件信息
         * 若文件不存在则抛出异常
         * @throw FileException
         */
        void loadFromLocal(const std::string &filePath);
        /**
         * 从本地文件路径中加载文件信息并返回新的FileInfo对象
         * 若文件不存在则抛出异常
         * @throw FileException
         */
        static FileInfo getFromLocal(const char * filePath);
        /**
         * 从本地文件路径中加载文件信息并返回新的FileInfo对象
         * 若文件不存在则抛出异常
         * @throw FileException
         */
        static FileInfo getFromLocal(const std::string &filePath);
        /**
         * 取文件后缀名（不带.）
         */
        std::string getSuffix();
        static std::string getSuffix(std::string &name);
        bool isDir();
        bool isFile();

};

class Path {
    public:
        Path();
        Path(const char * path);
        /**
         *  在原有路径上追加路径 
         */
        bool append(const char * path);

        /**
         *  取出当前完整路径 
         */
        std::string getPath();

        /**
         *  设置路径，将覆盖原有路径
         *  
         */
        void setPath(const char * str);
        const std::vector<std::string>& getPathList();
        int size();

        /**
         *  取出路径中的第i个节点（节点从0开始计数）
         */
        const std::string& operator[](int i) ;
    private:
        std::vector<std::string> path_list;
};

namespace FileUtils {
        enum fileType { dir=1, file=2 };
        // 扫描一个目录，获取一个目录的文件列表
        std::list<FileInfo> scanDir(const char * path) ;
        // 对一个文件进行遍历，取出所有文件列表
        std::list<FileInfo> traverseDir(const char * path) ;
        FileInfo getFileInfo(const char * filename);
        bool mkdirs(const char * path) ;
        std::string toSizeString(size_t size);
};
#endif